Concurrency Management হল একটি গুরুত্বপূর্ণ ধারণা যেখানে একাধিক কাজ একসাথে (প্যারালাল) সম্পাদন করা হয়। Java-তে java.util.concurrent প্যাকেজটি concurrency এবং multi-threading এর কাজকে সহজ এবং কার্যকরী করার জন্য বিভিন্ন ক্লাস এবং ইন্টারফেস সরবরাহ করে। এর মধ্যে ExecutorService এবং Thread Pools গুলি অন্যতম শক্তিশালী টুলস যা concurrency ব্যবস্থাপনা করতে সহায়তা করে।
Concurrency এবং Thread Pools এর ধারণা
Concurrency হল একাধিক কাজের একসাথে সম্পাদন, যাতে একাধিক থ্রেড একযোগে কাজ করতে পারে এবং সময়ের ব্যবধানে সম্পন্ন হতে পারে। সাধারণত একাধিক থ্রেড তৈরি এবং তাদের মধ্যে সমন্বয় করতে Thread Pool ব্যবহৃত হয়, যা থ্রেড ব্যবস্থাপনাকে সহজ এবং কার্যকরী করে।
Thread Pool হল এমন একটি প্রোগ্রামিং ধারণা যেখানে নির্দিষ্ট সংখ্যক থ্রেড তৈরি করা হয় এবং এগুলি পুনরায় ব্যবহার করা হয় বিভিন্ন কাজ সম্পাদনের জন্য, যা থ্রেড তৈরি ও ধ্বংস করার খরচ কমিয়ে দেয় এবং সিস্টেমের কর্মক্ষমতা বাড়ায়।
ExecutorService একটি ইন্টারফেস যা Executor ইন্টারফেসের প্রসারিত সংস্করণ এবং এটি থ্রেড ব্যবস্থাপনা এবং Thread Pool এর কার্যকারিতা প্রদান করে।
ExecutorService এবং Thread Pools এর মাধ্যমে Concurrency Management
ExecutorService ইন্টারফেসটি থ্রেডের জীবনচক্র পরিচালনা করার জন্য ব্যবহৃত হয়, যেখানে Thread Pool একটি সংগ্রহ, যা নির্দিষ্ট সংখ্যক থ্রেড তৈরি করে এবং নতুন কাজের জন্য তাদের পুনঃব্যবহার করে।
ExecutorService ইন্টারফেসের প্রধান মেথডসমূহ:
submit():
- এটি একটি
RunnableবাCallableকাজ গ্রহণ করে এবং একটিFutureঅবজেক্ট রিটার্ন করে, যা কাজটির ফলাফল বা অবস্থার ট্র্যাক রাখতে সাহায্য করে।
ExecutorService executor = Executors.newFixedThreadPool(2); executor.submit(() -> { System.out.println("Task 1 is running"); });- এটি একটি
- invokeAll():
- এটি একটি
Collectionএর মাধ্যমে একাধিকCallableকাজ গ্রহণ করে এবং প্রত্যেকটি কাজের ফলাফলFutureঅবজেক্টের মধ্যে জমা করে।
- এটি একটি
shutdown():
- থ্রেডপুলের সমস্ত থ্রেডের কাজ শেষ হলে
ExecutorServiceবন্ধ করার জন্য ব্যবহৃত হয়। এটি নতুন কাজ গ্রহণ বন্ধ করে দেয়, তবে যে কাজগুলি ইতিমধ্যে শুরু হয়েছে সেগুলি সম্পন্ন হয়।
executor.shutdown();- থ্রেডপুলের সমস্ত থ্রেডের কাজ শেষ হলে
- shutdownNow():
- এটি থ্রেডপুলের চলমান কাজগুলি শেষ করার জন্য চেষ্টা করে এবং অবিলম্বে থ্রেডগুলি বন্ধ করে দেয়।
Thread Pools এর ধারণা এবং ExecutorService এর মাধ্যমে তাদের ব্যবহার
Thread Pool ব্যবহারের মূল উদ্দেশ্য হল থ্রেড তৈরির জন্য অতিরিক্ত সময় ও সম্পদ খরচ কমানো। যখনই কোনো নতুন কাজ আসে, তখন ব্যবহৃত Thread Pool থেকে একটি থ্রেড পুনরায় ব্যবহার করা হয়।
Java-তে Executors ক্লাসের মাধ্যমে বিভিন্ন ধরনের Thread Pools তৈরি করা যায়:
FixedThreadPool:
- এটি একটি নির্দিষ্ট সংখ্যক থ্রেডের Thread Pool তৈরি করে।
ExecutorService executor = Executors.newFixedThreadPool(3);CachedThreadPool:
- এটি একটি থ্রেডপুল তৈরি করে যা প্রয়োজন অনুসারে থ্রেড তৈরি করে এবং তাদের ব্যবহারের পর পুনঃব্যবহার করে।
ExecutorService executor = Executors.newCachedThreadPool();SingleThreadExecutor:
- এটি একটি একক থ্রেডের Thread Pool তৈরি করে এবং যেকোনো সময় একটি কাজ সম্পাদন করতে ব্যবহৃত হয়।
ExecutorService executor = Executors.newSingleThreadExecutor();
Practical Example: ExecutorService and Thread Pool Usage
এখানে ExecutorService এবং Thread Pool এর ব্যবহার দেখানো হয়েছে যেখানে আমরা থ্রেডপুলের মাধ্যমে একাধিক কাজ concurrently সম্পাদন করছি:
Example: Using ExecutorService for Concurrent Tasks
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorServiceExample {
public static void main(String[] args) {
// Fixed Thread Pool of 3 threads
ExecutorService executorService = Executors.newFixedThreadPool(3);
// Submit multiple tasks to the ExecutorService
executorService.submit(() -> {
System.out.println("Task 1 is running in " + Thread.currentThread().getName());
});
executorService.submit(() -> {
System.out.println("Task 2 is running in " + Thread.currentThread().getName());
});
executorService.submit(() -> {
System.out.println("Task 3 is running in " + Thread.currentThread().getName());
});
// Shutdown the executor service
executorService.shutdown();
}
}
Output:
Task 1 is running in pool-1-thread-1
Task 2 is running in pool-1-thread-2
Task 3 is running in pool-1-thread-3
ব্যাখ্যা:
- এখানে
Executors.newFixedThreadPool(3)মেথডের মাধ্যমে একটি থ্রেডপুল তৈরি করা হয়েছে যার মধ্যে ৩টি থ্রেড রয়েছে। submit()মেথড ব্যবহার করে তিনটি কাজ ExecutorService এ জমা দেওয়া হয়েছে।- পরবর্তীতে
shutdown()মেথড ব্যবহার করে থ্রেডপুলটি বন্ধ করা হয়েছে।
ExecutorService এবং Thread Pools এর মাধ্যমে Concurrency Management এর সুবিধা:
- Resource Management:
- থ্রেডপুল ব্যবহারের মাধ্যমে থ্রেড তৈরি এবং ধ্বংস করার খরচ কমানো যায়, কারণ থ্রেডগুলো পুনরায় ব্যবহার করা যায়।
- Scalability:
- Thread Pools থ্রেডের সংখ্যা সীমাবদ্ধ করে কাজের জন্য নির্দিষ্ট সংখ্যক থ্রেড বরাদ্দ করে, যা সিস্টেমের ওপর অতিরিক্ত চাপ সৃষ্টি হওয়া থেকে রক্ষা করে।
- Improved Performance:
- ExecutorService ব্যবহারের মাধ্যমে কাজগুলির দ্রুত সমাধান হয় কারণ এটি থ্রেড ব্যবস্থাপনাকে সহজ করে এবং parallel processing এর সুযোগ প্রদান করে।
- Thread Safety:
- ExecutorService ব্যবহার করলে থ্রেড ব্যবস্থাপনা সহজ হয়ে ওঠে এবং থ্রেডের মধ্যে প্রতিযোগিতা (race conditions) কমানো যায়।
ExecutorService এবং Thread Pools হল Java-তে Concurrency Management এর জন্য অত্যন্ত শক্তিশালী টুলস। এগুলি থ্রেডগুলির সঠিক ব্যবস্থাপনা করতে সহায়তা করে এবং একাধিক কাজ একসাথে সম্পাদন করার সক্ষমতা প্রদান করে। Thread Pool ব্যবহারের মাধ্যমে থ্রেড তৈরির খরচ কমানো যায় এবং সিস্টেমের কর্মক্ষমতা বাড়ানো যায়। ExecutorService ইন্টারফেসটি থ্রেডপুল পরিচালনা, থ্রেডের জীবনচক্র নিয়ন্ত্রণ এবং থ্রেডের কাজ করার জন্য সুবিধাজনক মেথড সরবরাহ করে।
Read more